최근에 Crockford의 JSLint를 통해 일부 JavaScript 코드를 실행했는데 다음과 같은 오류가 발생했습니다. 1 행 문자 1의 문제 : "use strict"문이 없습니다. 검색을하면서 어떤 사람들은 "엄격한 사용"을 추가한다는 것을 깨달았습니다. 그들의 JavaScript 코드에. 문을 추가하면 오류가 더 이상 나타나지 않습니다. 안타깝게도 Google은이 문자열 문 뒤에 숨겨진 많은 역사를 밝히지 않았습니다. 확실히 그것은 자바 스크립트가 브라우저에 의해 해석되는 방식과 관련이 있어야하지만 그 효과가 무엇인지 모르겠습니다. 그래서 "엄격한 사용"이란 무엇입니까? 그것은 무엇을 의미하며 여전히 관련이 있습니까? 현재 브라우저가 "엄격한 사용"에 응답합니까? 문자열 또는 향후 사용을위한 것입니까?
2020-12-07 22:07:39
Javascript Strict Mode에 대한이 기사가 흥미로울 수 있습니다 : John Resig-ECMAScript 5 Strict Mode, JSON 등 흥미로운 부분을 인용하려면 : Strict Mode는 ECMAScript 5의 새로운 기능으로 "엄격한"작동 컨텍스트에 프로그램 또는 기능을 배치 할 수 있습니다. 이 엄격한 컨텍스트는 특정 작업이 수행되는 것을 방지하고 더 많은 예외를 발생시킵니다. 과: 엄격 모드는 다음과 같은 두 가지 방법으로 도움이됩니다. 일반적인 코딩 오류를 포착하여 예외를 발생시킵니다. 상대적으로 "안전하지 않은"작업 (예 : 전역 개체에 대한 액세스 권한 얻기)이 수행 될 때 오류를 방지하거나 발생시킵니다. 혼란 스럽거나 잘못 생각한 기능을 비활성화합니다. 또한 전체 파일에 "엄격 모드"를 적용 할 수 있습니다. 또는 특정 기능에만 사용할 수 있습니다 (John Resig의 기사에서 인용 됨). // 엄격하지 않은 코드 ... (함수(){ "엄격한 사용"; // 라이브러리를 엄격하게 정의하십시오 ... }) (); // 엄격하지 않은 코드 ... 이전 코드와 새 코드를 혼합해야하는 경우 도움이 될 수 있습니다 ;-) 따라서 Perl에서 사용할 수있는 "use strict"와 비슷하다고 생각합니다 (따라서 이름 이요?). 고장으로 이어질 수있는 더 많은 것을 감지하여 오류를 줄이는 데 도움이됩니다. 이제 모든 주요 브라우저에서 엄격 모드가 지원됩니다. 네이티브 ECMAScript 모듈 (import 및 export 문 포함) 및 ES6 클래스 내에서 엄격 모드는 항상 활성화되어 있으며 비활성화 할 수 없습니다. | 이것은 ECMAScript 5의 새로운 기능입니다. John Resig가 이에 대한 멋진 요약을 작성했습니다. 다음과 같이 JavaScript 파일 (파일 상단 또는 함수 내부)에 넣은 문자열입니다. "엄격한 사용"; 지금 코드에 넣으면 문자열이기 때문에 현재 브라우저에 문제가 발생하지 않아야합니다. 코드가 pragma를 위반하면 나중에 코드에 문제가 발생할 수 있습니다. 예를 들어, 현재 foo를 먼저 정의하지 않고 foo = "bar"를 가지고 있다면 코드가 실패하기 시작할 것입니다. 이것은 제 생각에 좋은 것입니다. | "엄격한 사용"문; 브라우저가 JavaScript의 축소되고 안전한 기능 세트 인 엄격 모드를 사용하도록 지시합니다. 기능 목록 (완벽하지 않음) 전역 변수를 허용하지 않습니다. (변수 이름에서 누락 된 var 선언 및 오타 포착) 자동 할당 실패는 엄격 모드에서 오류를 발생시킵니다 (NaN = 5; 할당). 삭제할 수없는 속성을 삭제하려고하면 (Object.prototype 삭제) 오류가 발생합니다. 객체 리터럴의 모든 속성 이름은 고유해야합니다 (var x = {x1 : "1", x1 : "2"}). 함수 매개 변수 이름은 고유해야합니다 (함수 합계 (x, x) {...}). 8 진수 구문을 금지합니다 (var x = 023; 일부 개발자는 앞의 0이 숫자를 변경하지 않는다고 잘못 가정합니다.) with 키워드 금지 Strict 모드의 eval은 새 변수를 도입하지 않습니다. 일반 이름 삭제 금지 (delete x;) 모든 형식의 이름 eval 및 인수의 바인딩 또는 할당을 금지합니다. Strict 모드는 형식 매개 변수를 사용하여 arguments 개체의 속성에 별칭을 지정하지 않습니다. (i.e. in function sum (a, b) {return arguments [0] + b;} 이것은 arguments [0]가 a 등에 바인딩되기 때문에 작동합니다.) arguments.callee는 지원되지 않습니다. [참조 : 엄격한 모드, Mozilla 개발자 네트워크] | 사람들이 엄격한 사용에 대해 걱정한다면 다음 기사를 확인하는 것이 좋습니다. 브라우저에서 ECMAScript 5 '엄격 모드'지원. 이것은 무엇을 의미합니까? NovoGeek.com-Krishna의 웹 로그 브라우저 지원에 대해 이야기하지만 더 중요한 것은 안전하게 처리하는 방법입니다. function isStrictMode () { return! this; } / * 'this'는 전역 객체를 참조하므로 false를 반환합니다. '! this'는 거짓이됩니다. * / function isStrictMode () { "엄격한 사용"; return! this; } / * 엄격 모드에서는 키워드 'this'가 true를 반환합니다. 전통적인 JS와 달리 전역 객체를 참조하지 않습니다. 그래서 여기서 'this'는 'undefined'이고 '! this'는 true가됩니다. * / | 주의를 기울이십시오. 모든 프로그래머에게 "엄격한 사용"을 기존 코드에 적용하는 것은 위험 할 수 있습니다! 이것은 코드를 '더 좋게'만들 수있는 기분이 좋고 행복한 얼굴 스티커가 아닙니다. "엄격한 사용"프라그 마를 사용하면 브라우저가 갑자기 던진 적이없는 임의의 위치에 예외를 던집니다. 그 지점에서 기본 / 느슨한 JavaScript가 행복하게 허용하지만 엄격한 JavaScript를 싫어하는 일을하고 있기 때문입니다! 코드에서 거의 사용되지 않는 호출에 숨어있는 엄격 성 위반이있을 수 있습니다.이 호출은 결국 실행될 때만 예외를 발생시킵니다. 예를 들어 유료 고객이 사용하는 프로덕션 환경에서! 급락하려는 경우 포괄적 인 단위 테스트 및 엄격하게 구성된 JSHint 빌드 작업과 함께 "엄격한 사용"을 적용하는 것이 좋습니다.이 작업은 폭발 할 모듈의 어두운 구석이 없다는 확신을 줄 것입니다. Strict Mode를 켰다는 이유만으로 끔찍합니다. 또는, 여기에 또 다른 옵션이 있습니다. 레거시 코드에 "엄격한 사용"을 추가하지 마십시오. 솔직히 그렇게하는 것이 더 안전 할 것입니다. 소유하지 않은 모듈에 "엄격한 사용"을 추가하지 마십시오.타사 모듈처럼 유지하십시오. 치명적인 갇힌 동물이라 할지라도 "엄격한 사용"은 좋은 일이 될 수 있지만 제대로해야한다고 생각합니다. 엄격하게하기에 가장 좋은시기는 프로젝트가 그린 필드이고 처음부터 시작할 때입니다. JSHint / JSLint를 모든 경고 및 옵션을 팀이 할 수있는 한 엄격하게 구성하고 Grunt + Karma + Chai와 같이 조작 된 좋은 빌드 / 테스트 / 어설 션 시스템을 확보 한 다음 모든 새 모듈을 "로 표시하기 시작합니다. 엄격한 사용 ". 많은 실수와 경고를 해결할 준비를하십시오. JSHint / JSLint가 위반을 생성하는 경우 빌드를 FAIL로 구성하여 모든 사람이 중력을 이해하도록하십시오. "엄격한 사용"을 채택했을 때 제 프로젝트는 그린 필드 프로젝트가 아니 었습니다. 결과적으로 내 IDE는 내 모듈의 절반에 "use strict"가 없기 때문에 빨간색 표시로 가득 차 있으며 JSHint는 이에 대해 불평합니다. 앞으로 어떤 리팩토링을해야하는지 상기시켜줍니다. 나의 목표는 나의 모든 "엄격한 사용"문구가 누락되어 레드 마크를 없애는 것이지만, 이제 몇 년이 지나야합니다. | '엄격한 사용'사용; 갑자기 코드가 더 나아지지는 않습니다. JavaScript 엄격 모드는 ECMAScript 5의 기능입니다. 스크립트 / 함수 상단에이를 선언하여 엄격 모드를 활성화 할 수 있습니다. '엄격한 사용'; JavaScript 엔진이이 지시문을 볼 때 특수 모드에서 코드를 해석하기 시작합니다. 이 모드에서는 잠재적 인 버그가 될 수있는 특정 코딩 관행이 감지 될 때 오류가 발생합니다 (엄격 모드의 이유). 이 예를 고려하십시오. var a = 365; var b = 030; 숫자 리터럴을 정렬하려는 집착으로 개발자는 실수로 8 진수 리터럴로 변수 b를 초기화했습니다. 비 엄격 모드는 이것을 값이 24 (10 진수) 인 숫자 리터럴로 해석합니다. 그러나 엄격 모드에서는 오류가 발생합니다. 엄격 모드의 전문 분야에 대한 전체 목록은이 답변을 참조하십시오. 어디에서 '엄격 사용'을 사용해야합니까? 내 새 JavaScript 애플리케이션에서 : 물론입니다! 코드로 어리석은 일을 할 때 Strict 모드를 내부 고발자로 사용할 수 있습니다. 내 기존 JavaScript 코드에서 : 아마 아닙니다! 기존 JavaScript 코드에 엄격 모드에서 금지 된 명령문이있는 경우 응용 프로그램이 중단됩니다. 엄격 모드를 원하는 경우 기존 코드를 디버그하고 수정할 준비가되어 있어야합니다. 이것이 'use strict'를 사용하는 이유입니다. 갑자기 코드가 더 나아지지는 않습니다. 엄격 모드는 어떻게 사용합니까? '엄격한 사용'을 삽입하십시오. 스크립트 위에 진술 : // 파일 : myscript.js '엄격한 사용'; var a = 2; .... myscript.js 파일의 모든 내용은 엄격 모드로 해석됩니다. 또는 'use strict'를 삽입하십시오. 함수 본문 위에 선언문 : function doSomething () { '엄격한 사용'; ... } 함수 doSomething의 어휘 범위에있는 모든 것은 엄격 모드로 해석됩니다. 여기서 어휘 범위라는 단어가 중요합니다. 예를 들어 엄격한 코드가 엄격하지 않은 라이브러리의 함수를 호출하면 코드 만 엄격 모드에서 실행되고 호출 된 함수는 실행되지 않습니다. 더 나은 설명은이 답변을 참조하십시오. 엄격 모드에서 금지되는 것은 무엇입니까? Strict 모드에서 금지되는 몇 가지 사항을 설명하는 멋진 기사를 찾았습니다 (단독 목록이 아닙니다). 범위 역사적으로 JavaScript는 어떻게 기능이 범위가 지정됩니다. 때로는 정적으로 범위가 지정된 것처럼 보이지만 일부 기능은 동적 범위가 지정된 것처럼 작동합니다. 이것은 혼란스럽고 프로그램을 읽고 이해하기 어렵게 만듭니다. 오해로 인해 버그가 발생합니다. 또한 성능 문제이기도합니다. 정적 범위 지정은 컴파일시 변수 바인딩을 허용합니다. 하지만 동적 범위에 대한 요구 사항은 바인딩이 상당한 성능과 함께 제공되는 런타임으로 지연됩니다. 패널티. 엄격 모드에서는 모든 변수 바인딩이 정적으로 수행되어야합니다. 이는 이전에 동적 바인딩이 필요했던 기능이 제거하거나 수정해야합니다. 특히 with 문은 제거되고 eval 기능의 발신자의 환경이 엄격하게 제한됩니다. 엄격한 코드의 장점 중 하나는 YUI Compressor와 같은 도구가 처리 할 때 더 나은 일을 할 수 있습니다. 암시 된 전역 변수 JavaScript는 전역 변수를 암시합니다. 만약 변수를 명시 적으로 선언하지 않으면 전역 변수는 암시 적으로 선언되었습니다. 이것은 프로그래밍을 더 쉽게 만듭니다. 초보자는 기본적인 관리를 소홀히 할 수 있기 때문에 집안일. 그러나 그것은 더 큰 프로그램의 관리를 훨씬 더 만듭니다 어렵고 신뢰성이 크게 저하됩니다. 그래서 엄격하게 모드에서는 암시 적 전역 변수가 더 이상 생성되지 않습니다. 당신은 모든 변수를 명시 적으로 선언하십시오. 글로벌 누출 이 문제를 일으킬 수있는 여러 상황이 있습니다. 전역 개체에 바인딩됩니다. 예를 들어, 생성자를 호출 할 때 새 접두사 제공기능, 생성자의 이것은 예기치 않게 전역 개체에 바인딩되므로 새 개체를 초기화하는 대신 조용히 전역 변수 조작. 이러한 상황에서 엄격 모드는 대신 이것을 undefined에 바인딩하면 생성자가 대신 예외를 던져 오류를 많이 감지 할 수 있습니다. 빨리. 시끄러운 실패 JavaScript에는 항상 읽기 전용 속성이 있었지만 ES5의 Object.createProperty까지 직접 만들 수 없습니다. 함수는 그 능력을 드러 냈습니다. 값을 할당하려는 경우 읽기 전용 속성으로 변경하면 자동으로 실패합니다. 할당은 부동산 가치를 변경하지 않지만 프로그램은 다음과 같이 진행됩니다. 그래도. 이것은 프로그램이 일관성이없는 상태가됩니다. 엄격 모드에서 읽기 전용 속성은 예외를 throw합니다. 8 진법 숫자의 8 진수 (또는 8 진수) 표현은 매우 기계 수준의 프로그래밍을 할 때 유용합니다. 크기는 3의 배수였습니다. CDC로 작업 할 때 8 진수가 필요했습니다. 워드 크기가 60 비트 인 6600 메인 프레임. 읽을 수 있다면 8 진수로 단어를 20 자리로 볼 수 있습니다. 두 자리 표시 op 코드와 한 자리가 8 개의 레지스터 중 하나를 식별했습니다. 시 기계 코드에서 고급 언어로의 느린 전환은 프로그래밍 언어에서 8 진 형식을 제공하는 데 유용하다고 생각됩니다. C에서 8 진법의 매우 불행한 표현은 선택됨 : 선행 0. 따라서 C에서 0100은 100이 아닌 64를 의미하고 08은 오류, 8이 아닙니다. 더 불행히도이 시대 착오주의는 JavaScript를 포함한 거의 모든 최신 언어로 복사됩니다. 오류를 생성하는 데만 사용됩니다. 다른 목적이 없습니다. 그래서 엄격 모드, 8 진수 형식은 더 이상 허용되지 않습니다. 등등 인수 의사 배열이 조금 더 ES5에서 배열과 유사합니다. 엄격 모드에서는 수신자와 발신자를 잃습니다. 속성. 이것은 당신의 주장을 신뢰할 수없는 사람에게 전달할 수있게합니다. 많은 기밀 컨텍스트를 포기하지 않고 코드를 작성합니다. 또한 함수의 인수 속성이 제거됩니다. 엄격 모드에서 함수 리터럴의 중복 키는 구문 오류입니다. 함수는 이름이 같은 두 개의 매개 변수를 가질 수 없습니다. 함수는 이름 중 하나와 이름이 같은 변수를 가질 수 없습니다. 매개 변수. 함수는 자체 변수를 삭제할 수 없습니다. 시도 구성 할 수없는 속성을 삭제하면 이제 예외가 발생합니다. 원어 값은 암시 적으로 래핑되지 않습니다. 향후 JavaScript 버전을위한 예약어 ECMAScript 5는 예약어 목록을 추가합니다. 변수 나 인수로 사용하면 엄격 모드에서 오류가 발생합니다. 예약어는 다음과 같습니다. 구현, 인터페이스, 렛, 패키지, 개인, 보호, 공개, 정적 및 양보 추가 읽기 엄격 모드-JavaScript | MDN 엄격 모드에 대한 브라우저 지원 엄격 모드로 전환 | 모든 개발자가 지금 엄격 모드를 사용하는 것이 좋습니다. Strict 모드를 지원하는 브라우저가 충분하므로 코드에 포함 된 사실조차 몰랐던 오류로부터 Google을 보호 할 수 있습니다. 분명히 초기 단계에는 이전에 경험하지 못한 오류가있을 것입니다. 완전한 이점을 얻으려면 엄격 모드로 전환 한 후 모든 것을 포착했는지 확인하기 위해 적절한 테스트를 수행해야합니다. 확실히 우리는 코드에서 엄격하게 사용하고 오류가 없다고 가정하지 않습니다. 따라서 이탈은이 믿을 수 없을 정도로 유용한 언어 기능을 사용하여 더 나은 코드를 작성하기 시작할 때입니다. 예를 들면 var person = { 이름 : 'xyz', 위치 : 'abc', fullname : function () { "엄격한 사용"; return this.name; } }; JSLint는 Douglas Crockford가 작성한 디버거입니다. 스크립트에 붙여 넣기 만하면 코드에서 눈에 띄는 문제와 오류를 빠르게 검색합니다. | 다른 답변을 보완하는 좀 더 근거있는 답변을 제공하고 싶습니다. 가장 인기있는 답변을 편집하고 싶었지만 실패했습니다. 가능한 한 포괄적이고 완전하게 만들려고 노력했습니다. 자세한 내용은 MDN 설명서를 참조하십시오. ECMAScript 5에 도입 된 "엄격한 사용"지시문. 지시문은 진술과 유사하지만 다릅니다. use strict는 키워드를 포함하지 않습니다. 지시문은 특수 문자열 리터럴 (작은 따옴표 또는 큰 따옴표로 묶음)으로 구성된 간단한 표현식 문입니다. ECMAScript 5를 구현하지 않는 JavaScript 엔진은 부작용없이 표현식 문만 볼 수 있습니다. ECMAScript 표준의 향후 버전에서는 실제 키워드로 사용이 도입 될 것으로 예상됩니다. 따라서 따옴표는 쓸모 없게 될 것입니다. use strict는 스크립트 또는 함수의 시작 부분에서만 사용할 수 있습니다. 즉, 다른 모든 (실제) 문 앞에 와야합니다. 함수 스크립트에서 첫 번째 명령어 일 필요는 없습니다. 문자열 리터럴 (및 JavaScript)로 구성된 다른 명령문 표현식이 앞에 올 수 있습니다.구현은 구현 특정 지시문으로 처리 할 수 있습니다.) 스크립트 또는 함수에서 첫 번째 실제 문 뒤에 오는 문자열 리터럴 문은 간단한 식 문입니다. 통역사는이를 지시어로 해석해서는 안되며 효과가 없습니다. use strict 지시문은 다음 코드 (스크립트 또는 함수에서)가 엄격한 코드임을 나타냅니다. 스크립트의 최상위 수준에있는 코드 (함수에없는 코드)는 스크립트가 use strict 지시문을 포함 할 때 엄격한 코드로 간주됩니다. 함수 자체가 엄격한 코드에 정의되어 있거나 함수에 use strict 지시문이 포함 된 경우 함수의 내용은 엄격한 코드로 간주됩니다. eval () 메서드에 전달 된 코드는 eval ()이 엄격한 코드에서 호출되거나 use strict 지시문 자체를 포함 할 때 엄격한 코드로 간주됩니다. ECMAScript 5의 엄격 모드는 JavaScript 언어의 제한된 하위 집합으로, 언어의 관련 결함을 제거하고보다 엄격한 오류 검사 및 더 높은 보안 기능을 제공합니다. 다음은 엄격 모드와 일반 모드의 차이점을 나열한 것입니다 (처음 3 개가 특히 중요 함). 엄격 모드에서는 with 문을 사용할 수 없습니다. 엄격 모드에서는 모든 변수를 선언해야합니다. 변수, 함수, 함수 매개 변수, catch-clause 매개 변수 또는 전역 개체의 속성으로 선언되지 않은 식별자에 값을 할당하면 ReferenceError가 발생합니다. 일반 모드에서 식별자는 전역 변수 (전역 개체의 속성)로 암시 적으로 선언됩니다. 엄격 모드에서 this 키워드는 메소드가 아닌 함수로 호출 된 함수에서 정의되지 않은 값을 갖습니다. (일반 모드에서는 항상 전역 개체를 가리 킵니다.) 이 차이는 구현이 엄격 모드를 지원하는지 테스트하는 데 사용할 수 있습니다. var hasStrictMode = (function () { "use strict"; return this === undefined} ()); 또한 함수가 call ()로 호출되거나 엄격 모드에서 적용되는 경우 이는 정확히 call () 또는 apply () 호출의 첫 번째 인수 값입니다. (일반 모드에서 null 및 undefined는 전역 개체로 대체되고 개체가 아닌 값은 개체로 캐스팅됩니다.) 엄격 모드에서는 읽기 전용 속성에 할당하거나 확장 할 수없는 개체에 대한 새 속성을 정의하려고하면 TypeError가 발생합니다. (일반 모드에서는 둘 다 오류 메시지없이 실패합니다.) Strict 모드에서 eval ()에 코드를 전달할 때 호출자 범위에서 변수 또는 함수를 선언하거나 정의 할 수 없습니다 (일반 모드에서 수행 할 수 있음). 대신 eval ()에 대해 새 범위가 생성되고 변수와 함수가 해당 범위 내에 있습니다. 해당 범위는 eval () 실행이 완료된 후에 삭제됩니다. 엄격 모드에서 함수의 arguments-object에는 해당 함수에 전달되는 값의 정적 복사본이 포함됩니다. 일반 모드에서 arguments-object는 다소 "마법적인"동작을합니다. 배열의 요소와 명명 된 함수 매개 변수는 모두 동일한 값을 참조합니다. 엄격 모드에서 삭제 연산자 뒤에 정규화되지 않은 식별자 (변수, 함수 또는 함수 매개 변수)가 오면 SyntaxError가 발생합니다. 일반 모드에서 삭제 표현식은 아무 작업도 수행하지 않으며 false로 평가됩니다. 엄격 모드에서 구성 할 수없는 속성을 삭제하려고하면 TypeError가 발생합니다. (일반 모드에서는 시도가 실패하고 삭제 표현식이 false로 평가됩니다.) 엄격 모드에서는 개체 리터럴에 대해 동일한 이름을 가진 여러 속성을 정의하려고 할 때 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.) 엄격 모드에서는 함수 선언에 동일한 이름의 여러 매개 변수가있는 경우 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.) Strict 모드에서는 8 진수 리터럴이 허용되지 않습니다 (이것들은 0x로 시작하는 리터럴입니다. (일반 모드에서 일부 구현은 8 진수 리터럴을 허용합니다).) 엄격 모드에서 식별자 eval 및 인수는 키워드처럼 처리됩니다. 값을 변경할 수없고 값을 할당 할 수 없으며 변수, 함수, 함수 매개 변수 또는 catch 블록의 식별자에 대한 이름으로 사용할 수 없습니다. 엄격 모드에서는 호출 스택을 검사 할 수있는 가능성에 대한 더 많은 제한이 있습니다. arguments.caller 및 arguments.callee는 엄격 모드의 함수에서 TypeError를 발생시킵니다. 또한 엄격 모드에서 함수의 일부 호출자 및 인수 속성을 읽으려고하면 TypeError가 발생합니다. | 내 2 센트 : 엄격 모드의 목표 중 하나는 문제를 더 빠르게 디버깅 할 수 있도록하는 것입니다. 웹 페이지의 조용하고 이상한 동작을 유발할 수있는 특정 잘못된 일이 발생할 때 예외를 발생시켜 개발자를 돕습니다. 엄격함을 사용하는 순간 코드는 개발자가 미리 수정하는 데 도움이되는 오류를 발생시킵니다. 엄격한 사용 후 배운 몇 가지 중요한 것 : 전역 변수 선언 방지 : var tree1Data= {이름 : '바나나 나무', 나이 : 100, leafCount : 100000}; function Tree (typeOfTree) { var age; var leafCount; 나이 = typeOfTree.age; leafCount = typeOfTree.leafCount; nameoftree = typeOfTree.name; }; var tree1 = new Tree (tree1Data); console.log (window); 이제이 코드는 window.nameoftree를 사용하여 액세스 할 수있는 전역 범위에 nameoftree를 만듭니다. 엄격한 사용을 구현하면 코드에서 오류가 발생합니다. 포착되지 않은 ReferenceError : nameoftree가 정의되지 않았습니다. 견본 문을 사용하여 제거합니다. with 문은 uglify-js와 같은 도구를 사용하여 축소 할 수 없습니다. 또한 향후 JavaScript 버전에서 더 이상 사용되지 않으며 제거됩니다. 견본 중복 방지 : 중복 속성이 있으면 예외가 발생합니다. 잡히지 않은 SyntaxError : 개체 리터럴에 중복 된 데이터 속성이 없습니다. 엄격 모드에서 허용 "엄격한 사용"; var tree1Data = { 이름 : '바나나 나무', 나이 : 100, leafCount : 100000, 이름 : '바나나 나무' }; 몇 가지가 더 있지만 그것에 대해 더 많은 지식을 얻어야합니다. | 작년에 출시 된 브라우저를 사용하는 경우 JavaScript Strict 모드를 지원할 가능성이 높습니다. ECMAScript 5가 현재 표준이되기 전의 오래된 브라우저 만이이를 지원하지 않습니다. 명령 주위의 따옴표는 코드가 이전 브라우저에서도 계속 작동하는지 확인합니다 (엄격 모드에서 구문 오류를 생성하는 것은 일반적으로 이전 브라우저에서 감지하기 어려운 방식으로 스크립트가 오작동을 유발할 수 있음). | "use strict";를 추가 할 때 다음 경우는 스크립트가 실행되기 전에 SyntaxError를 발생시킵니다. 새로 예약 된 키워드 (ECMAScript 6 이전 버전) 중 하나를 사용하여 향후 ECMAScript 버전을위한 길을 닦습니다 : 구현, 인터페이스, let, package, private, protected, public, static 및 yield. 블록에서 함수 선언 if (a : 3 : 15) <익명> : 6 : 5 여기서 컴파일러는 참조 오류를 발생시킵니다. Strict 모드에서 컴파일러는 변수를 선언하지 않고 사용하는 것을 허용하지 않습니다. 따라서 메모리 누수를 방지 할 수 있습니다. 또한 더 최적화 된 코드를 작성할 수 있습니다. | 엄격 모드는 엄격하지 않은 모드에서 무시되는 오류를 제거하여 자바 스크립트를 "더 안전하게"만듭니다. 모범 사례로 간주됩니까? 예, 엄격한 모드를 포함하도록 자바 스크립트로 작업하는 동안 모범 사례의 일부로 간주됩니다. JS 파일에 아래 코드 줄을 추가하면됩니다. '엄격한 사용'; 귀하의 코드에서. 사용자 에이전트에게는 어떤 의미입니까? 코드가 엄격 모드로 해석되어야 함을 표시하면 브라우저와 같은 사용자 에이전트가 코드를 문자 그대로 작성된대로 처리하고 코드가 의미가없는 경우 오류를 발생하도록 지정합니다. 예 : .js 파일에 다음 코드가 있다고 가정합니다. 시나리오 1 : [엄격 모드 없음] var city = "시카고" console.log (city) // 시카고와 같은 도시 이름을 인쇄합니다. 시나리오 2 : [엄격 모드 없음] 도시 = "시카고" console.log (city) // 시카고와 같은 도시 이름을 인쇄합니다. 그렇다면 두 경우 모두 변수 이름이 인쇄되는 이유는 무엇입니까? Strict 모드가 켜지지 않으면 사용자 에이전트는 종종 문제가있는 코드를 이해하기 위해 일련의 수정을 거칩니다. 표면적으로는 이것은 괜찮은 것처럼 보일 수 있으며 실제로 엄격 모드 밖에서 작업하면 사람들이 모든 세부 사항을 완벽하게 정리하지 않고도 JavaScript 코드에 발을 담글 수 있습니다. 그러나 개발자로서 나는 버그를 내 코드에 남기고 싶지 않습니다. 왜냐하면 나중에 돌아와서 나를 물릴 수 있다는 것을 알고 있기 때문이며 좋은 코드를 작성하고 싶습니다. 이것이 Strict 모드가 도움이되는 곳입니다. 시나리오 3 : [엄격한 모드] '엄격한 사용'; 도시 = "시카고" console.log (city) // 참조 오류 : asignment가 선언되지 않은 도시 변수입니다. 추가 팁 : Strict 모드를 사용하여 코드 품질을 유지하기 위해 특히 여러 .js 파일이있는 경우이를 반복해서 작성할 필요가 없습니다. 다음과 같이 eslint 규칙에서이 규칙을 전역 적으로 시행 할 수 있습니다. 파일 이름 : .eslintrc.js module.exports = { env : { es6 : 참 }, 규칙 : { 엄격 : [ 'error', 'global'], }, }; 좋아요, Strict 모드에서 금지되는 것은 무엇입니까? 선언하지 않고 변수를 사용하면 엄격 모드에서 오류가 발생합니다. 이는 응용 프로그램 전체에서 실수로 전역 변수를 만드는 것을 방지하기위한 것입니다. 시카고 인쇄의 예는 특히 이것을 다룹니다. 변수, 함수 또는 인수를 삭제하는 것은 엄격 모드에서 아니오입니다. "엄격한 사용"; 함수 x (p1, p2) {}; x 삭제; // 이로 인해 오류가 발생합니다. 엄격 모드에서는 매개 변수 이름을 복제 할 수 없습니다. "엄격한 사용"; 함수 x (p1, p1) {}; // 이로 인해 오류가 발생합니다. 자바 스크립트 언어의 예약어는 엄격 모드에서 허용되지 않습니다. 단어는 interface, let, packages, private, protected, public을 구현합니다. 정적 및 수율 보다 포괄적 인 목록은 여기에서 MDN 문서를 확인하십시오 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode | 매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다. 찾고있는 답변이 아닙니까? jslint use-strict 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.